<?php
/**
 * 管理员令牌
 * Created by PhpStorm.
 * User: 王海东
 * Date: 2018/12/21
 * Time: 14:49
 */
namespace app\common\model;

use think\db;

class AdminToken
{
    const TAB_NAME = 'admin_token';
    //token的有效时长（s）
    public const EXPIRE_TIME = 3600 * 12;


    /**
     * 获取token
     * @author 王崇全
     * @date
     * @param int  $adminId   用户ID
     * @param bool $isStrict 只查询有效的
     * @return array token数组
     */
    public function getTokens(int $adminId, bool $isStrict = true)
    {
        $dbw = Db::name(self::TAB_NAME)
                 ->where("admin_id", $adminId);
        if ($isStrict) {
            $dbw->where("create_time", ">= TIME", date("Y-m-d H:i:s", time() - self::EXPIRE_TIME));
        }

        $arr = $dbw->column("token");

        return $arr;
    }

    /**
     * 获取用户ID，可验证token是否有效
     * @author 王崇全
     * @date
     * @param string $token    令牌
     * @param bool   $isSingle 是否只有一个终端同时在线
     * @return int 用户ID
     * @throws
     */
    public function getUserId(string $token, bool $isSingle = false)
    {

        //根据token获取用户编号
        $adminId = Db::name(self::TAB_NAME)
                    ->where("token", $token)
                    ->where("create_time", ">= TIME", date("Y-m-d H:i:s", time() - self::EXPIRE_TIME))
                    ->value("admin_id");

        //刷新创建时间
        if ($adminId) {
            Db::name(self::TAB_NAME)
              ->where("token", $token)
              ->update([
                  "create_time" => date("Y-m-d H:i:s"),
              ]);

            //踢出其它终端
            if ($isSingle) {
                Db::name(self::TAB_NAME)
                  ->where("token", "<>", $token)
                  ->where("admin_id", $adminId)
                  ->delete();
            }
        } else {
            try {
                Db::name(self::TAB_NAME)
                  ->where("token", $token)
                  ->delete();
            } catch (\Exception $e) {
            }
        }

        return $adminId;
    }

    /**
     * 存入Token
     * @author 王崇全
     * @date
     * @param int $adminId 用户ID
     * @return string token
     * @throws \Exception
     */
    public function insertToken(int $adminId)
    {
        $token = uuid();

        $count = Db::name(self::TAB_NAME)
                   ->insert([
                       "admin_id"     => $adminId,
                       "token"       => $token,
                       "create_time" => date('Y-m-d H:i:s'),
                   ]);
        if ($count < 1) {
            throw new \Exception("令牌保存失败");
        }

        //删除过期令牌
        $this->removeOverdueToken();

        return $token;
    }

    /**
     * 删除过期的令牌
     * @author 王崇全
     * @date
     * @return void
     * @throws \Exception
     */
    protected function removeOverdueToken()
    {
        try {
            Db::name(self::TAB_NAME)
              ->where("create_time", "< TIME", date("Y-m-d H:i:s", time() - self::EXPIRE_TIME))
              ->delete();
        } catch (\Exception $e) {
            throw new \Exception();
        }

    }


}